﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenSource.UPnP;
using System.Windows;
using System.Windows.Controls;
using System.Reflection;
using System.Collections;

namespace ApplicationCliente2
{
    class ServeurApplicationCliente2
    {
        private UPnPDevice root;
        private UPnPService list;

        /**
           * \nb_dev1        le nombre de devices connectés
        */
        private int nb_dev1;
        static int ctr = 0;
       
        String[] tabresultat = new String[3];


        /**
         * \ServeurApplicationCliente2           Constructeur de la classe 'ServeurApplicationCliente2'
         
        */
        public ServeurApplicationCliente2()
        {
           
            root = UPnPDevice.CreateRootDevice(360, 1.0, "");
            root.FriendlyName = "ServeurClientUPnP2";
            root.DeviceURN = "urn:schemas-upnp-org:device:ServeurClientUPnP2:1";
            root.HasPresentation = false;
            root.Manufacturer = "sbai";
            root.ModelName = "UPnP sample for kids";
            root.UniqueDeviceName = "12345678-153f-430d-82f3-dff320c17504";

            list = new UPnPService(1.0, "SampleClient", "urn:schemas-upnp-org:service:SampleClient:1", true, this);

            list.AddMethod("getresultat2");
            list.AddMethod("AppelMethode2");
            root.AddService(list);
            root.Advertise();
        }


        /**
        * \startUPnP       pour démarrer le device
        */
        public void startUPnP()
        {
            root.StartDevice();
            Console.WriteLine("ServeurClientUPnP2 start");
        }



        /**
       * \stopUPnP       pour arrêter le device

       */
        public void stopUPnP()
        {
            root.StopDevice();
        }

        /**
       * \getresultat      une méthode intermédiaire pour récupérer le nom de la méthode que le serveur veut appeler
       * \param    meth    le nom de la méthode que le serveur veut appeler.
       */
       
        public string getresultat2(string meth) {


            Console.WriteLine("méthode getresultat2 est appelée : " + meth);

            //pour lister les méthodes d'une classe
            Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");

            string[] chh = AppelMethode2(meth);
            Console.WriteLine("Resultat final esttttt   :::::::   " + chh.Count());

            Console.WriteLine("chh est de valeur");
            for (int w = 0; w < chh.Count(); w++) {
                Console.WriteLine(chh[w]);
            }
            string result = "";

            for (int i = 0; i < chh.Count(); i++)
            {
                result = result + "," + chh[i];
            }

            Console.WriteLine("DDDDDDDDDDDDDDDDDDD"+result+"FFFFFFFFFFFFFFFFFFF");

                return result;
        }


        /**
       * \AppelMethode        Dans cette méthode j'ai utilisé la réflexion pour appeler dynamiquement des méthodes côté client.
       * \param    strParam   le nom de la méthode que le serveur veut appeler.
       */
        
        public string[] AppelMethode2(string strParam)
        {

            Console.WriteLine("strParam est de valeur:  " + strParam);
            // On récupère le Type de la classe elle-même
            Type oType = this.GetType();

            // On va récupérer la liste des méthodes qui existent dans la classe 'TestReflection'
            MethodInfo[] ListMethods = oType.GetMethods();
            string[] objVal=new string[3];
            // Donc pour chaque méthode :
            foreach (MethodInfo mi in ListMethods)
            {
                // Si le nom de la méthode est égale à "Appel_" + strPAram
                Console.WriteLine("mi est: " + mi.Name);
                if (mi.Name.Equals(strParam))
                {

                    Console.WriteLine("il ya cette méthode : " + strParam);
                    // Alors on 'exécute' cette méthode que l'on a trouvée
                    // On sait qu'elle retourne "quelqu'chose". Donc on récupère ce quelque chose
                    objVal = (string[])mi.Invoke(this, null);
                    // On sort de la boucle foreach
                    break;
                }
            }
            // Si on a rien trouvé, parce que objVal est resté null
            // Tu fais ce que tu veux. Moi j'exceptionne.
            //if (objVal == null)
              //  throw new Exception("Erreur dans l'invocation des méthodes dynamiquement...");
            // Sinon, je retourne la valeur string du résultat
            return objVal;
        }
        /**
     * \buttontest_Click2      la méthode liée au click sur le buttontest.
      */


        public string[] buttontest_Click2()
        {
            Console.WriteLine("méthode buttontest_Click2 est appelée : ");
            tabresultat[0] = "Message1";
            tabresultat[1] = "Text";
            tabresultat[2] = "Bonjouurrrrrrrr";
        
        return tabresultat;
        }

        /**
        * \button1_Click_12       la méthode liée au click sur le button12.
        */


        public string[] button1_Click_12()
        {
            Console.WriteLine("méthode button1_Click_12 est appelée : ");
            tabresultat[0] = "textBlock1";
            tabresultat[1] = "Text";
            tabresultat[2] = "Enfin j'ai généré mon interface";

            return tabresultat;
        }

    }
}
